home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 2517 / 2517.xpi / content / script-compiler.js < prev    next >
Text File  |  2009-08-15  |  6KB  |  185 lines

  1.  
  2. var googlepedia_gmCompiler={
  3.  
  4. // getUrlContents adapted from Greasemonkey Compiler
  5. // http://www.letitblog.com/code/python/greasemonkey.py.txt
  6. // used under GPL permission
  7. //
  8. // most everything else below based heavily off of Greasemonkey
  9. // http://greasemonkey.mozdev.org/
  10. // used under GPL permission
  11.  
  12. getUrlContents: function(aUrl){
  13.     var    ioService=Components.classes["@mozilla.org/network/io-service;1"]
  14.         .getService(Components.interfaces.nsIIOService);
  15.     var    scriptableStream=Components
  16.         .classes["@mozilla.org/scriptableinputstream;1"]
  17.         .getService(Components.interfaces.nsIScriptableInputStream);
  18.  
  19.     var    channel=ioService.newChannel(aUrl, null, null);
  20.     var    input=channel.open();
  21.     scriptableStream.init(input);
  22.     var    str=scriptableStream.read(input.available());
  23.     scriptableStream.close();
  24.     input.close();
  25.  
  26.     return str;
  27. },
  28.  
  29. isGreasemonkeyable: function(url) {
  30.     var scheme=Components.classes["@mozilla.org/network/io-service;1"]
  31.         .getService(Components.interfaces.nsIIOService)
  32.         .extractScheme(url);
  33.     return (
  34.         (scheme == "http" || scheme == "https" || scheme == "file") &&
  35.         !/hiddenWindow\.html$/.test(url)
  36.     );
  37. },
  38.  
  39. contentLoad: function(e) {
  40.     var unsafeWin=e.target.defaultView;
  41.     if (unsafeWin.wrappedJSObject) unsafeWin=unsafeWin.wrappedJSObject;
  42.  
  43.     var unsafeLoc=new XPCNativeWrapper(unsafeWin, "location").location;
  44.     var href=new XPCNativeWrapper(unsafeLoc, "href").href;
  45.  
  46.     if (
  47.         googlepedia_gmCompiler.isGreasemonkeyable(href)
  48.         && ( /http:\/\/www\.google\..*\/search.*q=.*/.test(href) )
  49.         && true
  50.     ) {
  51.         var script=googlepedia_gmCompiler.getUrlContents(
  52.             'chrome://googlepedia/content/googlepedia.js'
  53.         );
  54.         googlepedia_gmCompiler.injectScript(script, href, unsafeWin);
  55.     }
  56. },
  57.  
  58. injectScript: function(script, url, unsafeContentWin) {
  59.     var sandbox, script, logger, storage, xmlhttpRequester;
  60.     var safeWin=new XPCNativeWrapper(unsafeContentWin);
  61.  
  62.     sandbox=new Components.utils.Sandbox(safeWin);
  63.  
  64.     var storage=new googlepedia_ScriptStorage();
  65.     xmlhttpRequester=new googlepedia_xmlhttpRequester(
  66.         unsafeContentWin, window//appSvc.hiddenDOMWindow
  67.     );
  68.  
  69.     var stringsBundle = document.getElementById("string-bundle-googlepedia");
  70.  
  71.     sandbox.window=safeWin;
  72.     sandbox.document=sandbox.window.document;
  73.     sandbox.unsafeWindow=unsafeContentWin;
  74.  
  75.     // patch missing properties on xpcnw
  76.     sandbox.XPathResult=Components.interfaces.nsIDOMXPathResult;
  77.  
  78.     // add our own APIs
  79.     sandbox.GM_addStyle=function(css) { googlepedia_gmCompiler.addStyle(sandbox.document, css) };
  80.     sandbox.GM_setValue=googlepedia_gmCompiler.hitch(storage, "setValue");
  81.     sandbox.GM_getValue=googlepedia_gmCompiler.hitch(storage, "getValue");
  82.     sandbox.GM_openInTab=googlepedia_gmCompiler.hitch(this, "openInTab", unsafeContentWin);
  83.     sandbox.GM_xmlhttpRequest=googlepedia_gmCompiler.hitch(
  84.         xmlhttpRequester, "contentStartRequest"
  85.     );
  86.     sandbox.getString=function(key){ return stringsBundle.getString(key); };
  87.     //unsupported
  88.     sandbox.GM_registerMenuCommand=function(){};
  89.     sandbox.GM_log=function(){};
  90.  
  91.     sandbox.__proto__=sandbox.window;
  92.  
  93.     try {
  94.         this.evalInSandbox(
  95.             "(function(){"+script+"})()",
  96.             url,
  97.             sandbox);
  98.     } catch (e) {
  99.         var e2=new Error(typeof e=="string" ? e : e.message);
  100.         e2.fileName=script.filename;
  101.         e2.lineNumber=0;
  102.         //GM_logError(e2);
  103.         //alert(e2);
  104.     }
  105. },
  106.  
  107. evalInSandbox: function(code, codebase, sandbox) {
  108.     if (Components.utils && Components.utils.Sandbox) {
  109.         // DP beta+
  110.         Components.utils.evalInSandbox(code, sandbox);
  111.     } else if (Components.utils && Components.utils.evalInSandbox) {
  112.         // DP alphas
  113.         Components.utils.evalInSandbox(code, codebase, sandbox);
  114.     } else if (Sandbox) {
  115.         // 1.0.x
  116.         evalInSandbox(code, sandbox, codebase);
  117.     } else {
  118.         throw new Error("Could not create sandbox.");
  119.     }
  120. },
  121.  
  122. openInTab: function(unsafeContentWin, url) {
  123.     var unsafeTop = new XPCNativeWrapper(unsafeContentWin, "top").top;
  124.  
  125.     for (var i = 0; i < this.browserWindows.length; i++) {
  126.         this.browserWindows[i].openInTab(unsafeTop, url);
  127.     }
  128. },
  129.  
  130. hitch: function(obj, meth) {
  131.     if (!obj[meth]) {
  132.         throw "method '" + meth + "' does not exist on object '" + obj + "'";
  133.     }
  134.  
  135.     var staticArgs = Array.prototype.splice.call(arguments, 2, arguments.length);
  136.  
  137.     return function() {
  138.         // make a copy of staticArgs (don't modify it because it gets reused for
  139.         // every invocation).
  140.         var args = staticArgs.concat();
  141.  
  142.         // add all the new arguments
  143.         for (var i = 0; i < arguments.length; i++) {
  144.             args.push(arguments[i]);
  145.         }
  146.  
  147.         // invoke the original function with the correct this obj and the combined
  148.         // list of static and dynamic arguments.
  149.         return obj[meth].apply(obj, args);
  150.     };
  151. },
  152.  
  153. onLoad: function() {
  154.     var    appcontent=window.document.getElementById("appcontent");
  155.     if (appcontent && !appcontent.greased_googlepedia_gmCompiler) {
  156.         appcontent.greased_googlepedia_gmCompiler=true;
  157.         appcontent.addEventListener("DOMContentLoaded", googlepedia_gmCompiler.contentLoad, false);
  158.     }
  159. },
  160.  
  161. onUnLoad: function() {
  162.     //remove now unnecessary listeners
  163.     window.removeEventListener('load', googlepedia_gmCompiler.onLoad, false);
  164.     window.removeEventListener('unload', googlepedia_gmCompiler.onUnLoad, false);
  165.     window.document.getElementById("appcontent")
  166.         .removeEventListener("DOMContentLoaded", googlepedia_gmCompiler.contentLoad, false);
  167. }
  168.  
  169. }; //object googlepedia_gmCompiler
  170.  
  171.  
  172. function googlepedia_ScriptStorage() {
  173.     this.prefMan=new googlepedia_PrefManager();
  174. }
  175. googlepedia_ScriptStorage.prototype.setValue = function(name, val) {
  176.     this.prefMan.setValue(name, val);
  177. }
  178. googlepedia_ScriptStorage.prototype.getValue = function(name, defVal) {
  179.     return this.prefMan.getValue(name, defVal);
  180. }
  181.  
  182.  
  183. window.addEventListener('load', googlepedia_gmCompiler.onLoad, false);
  184. window.addEventListener('unload', googlepedia_gmCompiler.onUnLoad, false);
  185.